import json
from course.models import CourseModel
from django_redis import get_redis_connection


# 获取当前用户的所有优惠券：使用、未使用、过期的：列表
def get_user_coupon_list(user_id):
    # 用于获取与Redis的连接的函数
    redis = get_redis_connection('coupon')
    # 查找所有以特定 user_id 开头的键
    coupon_list = redis.keys(f"{user_id}:*")

    # b'1:14'    b'b1:b2'    b表示字节类型  byte
    # 1: 14
    # bit    0000 0000   = 1 byte  字节
    # [(),()]
    # : 分割  最后一位

    # 将一个包含字节对象的列表 coupon_list 转换为一个包含字符串对象的列表 coupon_id_list
    coupon_id_list = [i.decode() for i in coupon_list]

    # 创建一个空列表，并将其赋值给变量coupon_data
    coupon_data = []

    for coupon_key in coupon_id_list:
        # 1: 14
        # 获取优惠券id 字典推导式，用于从 coupon_key 中提取信息并创建一个新的字典
        coupon_item = {"user_coupon_id": int(coupon_key.split(':')[-1])}
        # 根据key，获取所对应的所有的属性
        coupon_hash = redis.hgetall(coupon_key)
        # 循环coupon_hash,获取所有属性
        for key, value in coupon_hash.items():
            key = key.decode()
            value = value.decode()
            # 判断  key   获取到的key为外键的情况下，需要对value进行json处理
            if key in ['to_direction', 'to_category', 'to_course']:
                value = json.loads(value)
            # 给他的键赋一个新的值value
            coupon_item[key] = value
        coupon_data.append(coupon_item)
    return coupon_data

# 获取当前用户有效优惠券：购买时候   当前下单可用优惠券
def get_user_enable_coupon_list(user_id):
    # 获取当前用户本次下单的优惠券列表
    # 获取当前用户下单的，需要购买的课程列表
    redis = get_redis_connection('cart')
    cart_hash = redis.hgetall(f"cart_{user_id}")
    # 选中、数据类型   购物车数据格式     cart_1:   1 1
    # 交集、并集、差集   {1,2,33,4}  set 集合
    course_id_list = {int(key.decode()) for key,value in cart_hash.items() if value == b'1'}
    # 获取对应的课程列表信息  -- mysql中获取数据
    course_list = CourseModel.objects.filter(id__in = course_id_list,is_deleted=False,is_show=True)

    # 遍历课程，获取所有课程所对应的分类id列表，和方向id列表
    direction_id_list = set()
    category_id_list = set()
    # 课程1 课程2 课程3
    # 1     1     1后端        课程4 课程5
    # 循环遍历课程，获取课程所对应的方向、分类id列表，使用set集合存储，去重
    for course in course_list:
        direction_id_list.add(course.direction.id)
        category_id_list.add(course.category.id)


    # 获取优惠券列表,get_user_coupon_list函数已经实现,调用即可
    coupon_data = get_user_coupon_list(user_id)

    # 构建一个可用的优惠券列表的空对象,用于存储比对完成的优惠券
    enable_coupon_list = []

    # 循环比对,循环优惠券数据
    for item in coupon_data:
        # 优惠券类型:通用  减免   折扣
        # 课程:   课程、分类   方向
        # 通用优惠券是所有课程通用,是一个可用优惠券

        coupon_type = int(item.get('coupon_type'))
        if coupon_type == 0:
            # 通用优惠券
            item['enable_course'] = "__all__"
            enable_coupon_list.append(item)
        elif coupon_type == 1:
            # 方向优惠券    获取所有方向的id
            # 优惠券对应方向的列表
            coupon_direction = {direction_item['direction__id'] for direction_item in item.get('to_direction')}
                # {1  前端}
            # 将循环获取到的优惠券所对应的方向id列表,与购物车中选中商品所对应的方向id列表,进行比对,比对成功,存在相同的id
            # 如何对比??  集合获取交集的方式
            # 测试
            # 购物车中存在方向id列表 {1,2,3,5}
            # 优惠券中存在对应方向id列表{2,4,5,6}
            # 集合交集获取数据
            ret = coupon_direction & direction_id_list
            if len(ret)>0:
                # 可用课程id
                item['enable_course'] = {int(course.id) for course in course_list if course.direction.id in ret}
                enable_coupon_list.append(item)

        elif coupon_type == 2:
            # 分类优惠券  item当前循环的优惠券
            # 获取当前优惠券所对应优惠券的分类id
            coupon_category = {category_item['category__id'] for category_item in item.get("to_category")}

            ret = coupon_category & category_id_list

            if len(ret)>0:
                item['enable_course'] = {int(course.id) for course in course_list if course.category.id in ret}
                enable_coupon_list.append(item)
        elif coupon_type ==3:
            # 针对课程的优惠券
            coupon_course = {course_item['course__id'] for course_item in item.get('to_course')}
            # 交集判断数据
            ret = coupon_course & course_id_list
            if len(ret)>0:
                item['enable_course'] ={int(course.id) for course in course_list if course.id in ret}
                enable_coupon_list.append(item)
    return enable_coupon_list
